bleh
[mqlkit.git] / Moving Average.mq4
blob86e00548bcabc9a0d98b949a57b8ba7ab83f07c0
1 //+------------------------------------------------------------------+\r
2 //|                                               Moving Average.mq4 |\r
3 //|                      Copyright © 2005, MetaQuotes Software Corp. |\r
4 //|                                       http://www.metaquotes.net/ |\r
5 //+------------------------------------------------------------------+\r
6 #define MAGICMA  20050610\r
7 \r
8 extern double Lots               = 0.1;\r
9 extern double MaximumRisk        = 0.02;\r
10 extern double DecreaseFactor     = 3;\r
11 extern double MovingPeriod       = 12;\r
12 extern double MovingShift        = 6;\r
13 //+------------------------------------------------------------------+\r
14 //| Calculate open positions                                         |\r
15 //+------------------------------------------------------------------+\r
16 int CalculateCurrentOrders(string symbol)\r
17   {\r
18    int buys=0,sells=0;\r
19 //----\r
20    for(int i=0;i<OrdersTotal();i++)\r
21      {\r
22       if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==false) break;\r
23       if(OrderSymbol()==Symbol() && OrderMagicNumber()==MAGICMA)\r
24         {\r
25          if(OrderType()==OP_BUY)  buys++;\r
26          if(OrderType()==OP_SELL) sells++;\r
27         }\r
28      }\r
29 //---- return orders volume\r
30    if(buys>0) return(buys);\r
31    else       return(-sells);\r
32   }\r
33 //+------------------------------------------------------------------+\r
34 //| Calculate optimal lot size                                       |\r
35 //+------------------------------------------------------------------+\r
36 double LotsOptimized()\r
37   {\r
38    double lot=Lots;\r
39    int    orders=HistoryTotal();     // history orders total\r
40    int    losses=0;                  // number of losses orders without a break\r
41 //---- select lot size\r
42    lot=NormalizeDouble(AccountFreeMargin()*MaximumRisk/1000.0,1);\r
43 //---- calcuulate number of losses orders without a break\r
44    if(DecreaseFactor>0)\r
45      {\r
46       for(int i=orders-1;i>=0;i--)\r
47         {\r
48          if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY)==false) { Print("Error in history!"); break; }\r
49          if(OrderSymbol()!=Symbol() || OrderType()>OP_SELL) continue;\r
50          //----\r
51          if(OrderProfit()>0) break;\r
52          if(OrderProfit()<0) losses++;\r
53         }\r
54       if(losses>1) lot=NormalizeDouble(lot-lot*losses/DecreaseFactor,1);\r
55      }\r
56 //---- return lot size\r
57    if(lot<0.1) lot=0.1;\r
58    return(lot);\r
59   }\r
60 //+------------------------------------------------------------------+\r
61 //| Check for open order conditions                                  |\r
62 //+------------------------------------------------------------------+\r
63 void CheckForOpen()\r
64   {\r
65    double ma;\r
66    int    res;\r
67 //---- go trading only for first tiks of new bar\r
68    if(Volume[0]>1) return;\r
69 //---- get Moving Average \r
70    ma=iMA(NULL,0,MovingPeriod,MovingShift,MODE_SMA,PRICE_CLOSE,0);\r
71 //---- sell conditions\r
72    if(Open[1]>ma && Close[1]<ma)  \r
73      {\r
74       res=OrderSend(Symbol(),OP_SELL,LotsOptimized(),Bid,3,0,0,"",MAGICMA,0,Red);\r
75       return;\r
76      }\r
77 //---- buy conditions\r
78    if(Open[1]<ma && Close[1]>ma)  \r
79      {\r
80       res=OrderSend(Symbol(),OP_BUY,LotsOptimized(),Ask,3,0,0,"",MAGICMA,0,Blue);\r
81       return;\r
82      }\r
83 //----\r
84   }\r
85 //+------------------------------------------------------------------+\r
86 //| Check for close order conditions                                 |\r
87 //+------------------------------------------------------------------+\r
88 void CheckForClose()\r
89   {\r
90    double ma;\r
91 //---- go trading only for first tiks of new bar\r
92    if(Volume[0]>1) return;\r
93 //---- get Moving Average \r
94    ma=iMA(NULL,0,MovingPeriod,MovingShift,MODE_SMA,PRICE_CLOSE,0);\r
95 //----\r
96    for(int i=0;i<OrdersTotal();i++)\r
97      {\r
98       if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==false)        break;\r
99       if(OrderMagicNumber()!=MAGICMA || OrderSymbol()!=Symbol()) continue;\r
100       //---- check order type \r
101       if(OrderType()==OP_BUY)\r
102         {\r
103          if(Open[1]>ma && Close[1]<ma) OrderClose(OrderTicket(),OrderLots(),Bid,3,White);\r
104          break;\r
105         }\r
106       if(OrderType()==OP_SELL)\r
107         {\r
108          if(Open[1]<ma && Close[1]>ma) OrderClose(OrderTicket(),OrderLots(),Ask,3,White);\r
109          break;\r
110         }\r
111      }\r
112 //----\r
113   }\r
114 //+------------------------------------------------------------------+\r
115 //| Start function                                                   |\r
116 //+------------------------------------------------------------------+\r
117 void start()\r
118   {\r
119 //---- check for history and trading\r
120    if(Bars<100 || IsTradeAllowed()==false) return;\r
121 //---- calculate open orders by current symbol\r
122    if(CalculateCurrentOrders(Symbol())==0) CheckForOpen();\r
123    else                                    CheckForClose();\r
124 //----\r
125   }\r
126 //+------------------------------------------------------------------+